Cet article présente la réalisation d’un LIDAR avec un capteur laser Time-of-Flight (ToF) .
Matériels nécessaire :
- Une carte Esus
- Un capteur VL53L0X de chez Pololu
- Un servomoteur AX12
Logicielle:
- Librairie pour le capteur VL53L0X, ici.
- Processing
- Arduino IDE
Synoptique
Le servomoteur AX12 est câblé sur la sortie Tx de la carte Esus. Puis le capteur VL53L0X, IO n°2 pour SDA et n°13 pour le signal SDL du bus I2C.
L’alimentation doit être d’au moins 7 Volt pour faire fonctionner le servomoteur. La capteur laser est alimenté par une tension de 3.3V présente sur la carte Esus.
Le code de la carte Esus
La carte Esus contrôle le servomoteur pour le déplacement d’un angle de 0 à 300° aller-retour. De plus, elle gère l’acquisition de la distance obtenu par le capteur VL53L0X.
Voici le setup :
void setup() { // init serial Serial.begin(9600); // init serial AX12 swSer.begin(1000000); // init I2C Wire.begin(2, 13);//SDA, SCL // init VL53L0X sensor.init(); sensor.setTimeout(500); state = 1; }
La boucle infini :
void loop() { // servomotor control AX12_GoalPosition(0xFE, angle, 1023); // read distance data = sensor.readRangeSingleMillimeters(); // send distance Serial.write(data>>8); Serial.write(data); // send angle Serial.write(angle>>8); Serial.write(angle); // angle between 0 and 300 ° if(( angle <= 300)and(state == 1)) { angle = angle + 1; } else { state = 2; } if(( angle >= 0)and(state == 2)) { angle = angle - 1; } else { state = 1; } delay(5);
Voici le programme complet, ici.
Le programme de visualisation
Voici le programme Processing de visualisation :
import processing.serial.*; Serial myPort; String val; int distance_mm, val_old; int angle; float radian; float pox,poy; int x=0; void setup() { size(400, 400); background(255); myPort = new Serial(this, "COM13", 9600); } void draw() { if(myPort.available() >= 4) { val_old = distance_mm; distance_mm = (myPort.read() << 8) | (myPort.read()); print("Val1:"); println(distance_mm); distance_mm = distance_mm/2; angle = (myPort.read() << 8) | (myPort.read()); print("Angle:"); println(angle); myPort.clear(); if(angle <= 45) { angle = angle + 315; } else { angle = angle - 45; } } // conversion degre radian radian = (angle * 3.14)/180; pox = int(cos(radian)*distance_mm); poy = int(sin(radian)*distance_mm); clear(); background(255); stroke(0, 0, 0); // grille line(200,0,200,400); line(0,200,400,200); stroke(255, 0, 0); line(200,200,int(pox)+200,200-int(poy)); }
Améliorations
- Vitesse
- Retour de l’angle du servomoteur AX12